#!/bin/bash

# 定义 I2C 总线号和设备地址
I2C_BUS=7
DEVICE_ADDR=0x48

# 配置寄存器（只配置一次）
declare -A REGISTERS=(
    [0x1]=0x80d5
    [0x2]=0x0080
    [0x3]=0xff7f
    [0x4]=0x0000
)
ORDER=(0x4 0x1 0x2 0x3)

# 配置寄存器
for reg in "${ORDER[@]}"; do
    value=${REGISTERS[$reg]}
    i2cset -y $I2C_BUS $DEVICE_ADDR "$reg" "$value" w 2>/dev/null
    if [ $? -ne 0 ]; then
        echo "配置寄存器失败: $reg"
        echo "4-20mA输入1测试失败"
        exit 1
    fi
done

# 测试参数
THRESHOLD=1000
ATTEMPTS=5
MIN_SUCCESS=3
success_count=0

# 执行 5 次读取
for ((i=1; i<=ATTEMPTS; i++)); do
    read_value=$(i2cget -y $I2C_BUS $DEVICE_ADDR 0x0 i 3 2>/dev/null)
    if [ $? -eq 0 ]; then
        # 解析三个字节
        set -- $read_value
        byte1=${1#0x}
        byte2=${2#0x}
        byte3=${3#0x}

        # 组合成 24 位值（按无符号处理）
        ad_value=$(( (0x${byte1:-0} << 16) | (0x${byte2:-0} << 8) | (0x${byte3:-0}) ))

        # 判断是否有效
        if [ $ad_value -gt $THRESHOLD ]; then
            echo "第${i}次读取 (Decimal): $ad_value"
            echo "第${i}次读取 (Hexadecimal): 0x$(printf "%06X" $ad_value)"
            ((success_count++))
        else
            echo "第${i}次读取: 值过小 ($ad_value)"
        fi
    else
        echo "第${i}次读取: I2C 通信失败"
    fi

    sleep 0.1
done

# 最终判断
if [ $success_count -ge $MIN_SUCCESS ]; then
    echo "4-20mA输入2测试成功"
    exit 0
else
    echo "4-20mA输入2测试失败（仅 $success_count/$ATTEMPTS 次有效）"
    exit 1
fi